package br.gov.ifrn.action;

import java.io.IOException;

import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import br.gov.ifrn.ws.interfaces.Dao;

/**
 * @author diego
 */
@Named
abstract class Action {

	private boolean isXml;
	
	private boolean dadosInicializados;
	
	private FacesContext facesContext;
	
	@Inject
	private Dao dao;
	
	private String url;
	
	public Action() {
		facesContext = FacesContext.getCurrentInstance();
		url = new String("#");
		String request = (String) getFacesContext().getExternalContext().getRequestParameterMap().get("type");
		if( "xml".equals(request) )
			isXml = true;
		inicia();
	}
	
	public boolean hasDadosInicializados() {
		return dadosInicializados;
	}

	public void setDadosInicializados(boolean dadosInicializados) {
		this.dadosInicializados = dadosInicializados;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public boolean isRequestXml() {
		return isXml;
	}
	
	public Dao getDao() {
		return dao;
	}

	public FacesContext getFacesContext() {
		return facesContext;
	}
	
	public String getAppContextName(){
		return facesContext.getExternalContext().getRequestContextPath();
	}
	
	public String getPathContextName(){
		return facesContext.getExternalContext().getRequestServletPath();
	}
	
	public void redirect( String path ){
		try {
			facesContext.getExternalContext().redirect( getAppContextName() + path );
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void redirectResteasy( String path ){
		redirect( "/resteasy" + path );
	}
	
	public void dispatch( String path ){
		try {
			facesContext.getExternalContext().dispatch( path );
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void dispatchResteasy( String path ){
		dispatch( "/resteasy" + path );
	}
	
	public String inicia(){
		if( !hasDadosInicializados() ){
			inicializaDados();
		}
		return getUrl();
	}

	public abstract void inicializaDados();

	public abstract String confirma();

	public abstract String cancela();

}
